package com.dhj.jvmstudy.chapter01;

/**
 * 学习clinit方法
 */
public class ClassInitTest {

    private static int num = 1;

    static {
        num = 2;
        number = 20;
        System.out.println(num);
        // System.out.println(number); 报错，非法的前向引用。Illegal forward reference
        // 前向引用只能赋值，不能调用
    }

    private static int number = 10;

    public static void main(String[] args) {
        System.out.println(ClassInitTest.num);   // 2
        System.out.println(ClassInitTest.number); // 20
    }

    /**
     * 1、在类加载的Linking(链接)阶段，number和num都加载到堆内存中，并赋值为0
     * 2、在类加载的Initial(初始化)阶段，则根据代码块的先后位置进行赋值。
     * 如果还不是很清楚，可以通过jclassLib插件来查看器字节码文件。
     */
}
